Représentations graphiques des données

On utilisera les différentes variables du jeu de données "imdb_dataset" pour tester les différents outils de représentation des données.

In [26]:
import numpy as np 
import csv
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
sns.set(color_codes = True)
from data import *
from scipy import stats

def statistiques(data):
    mini = np.min(data)
    maxi = np.max(data)
    moy = np.mean(data)
    med = np.median(data)
    std = np.std(data)
    Q1 = np.percentile(data, 25)
    Q3 = np.percentile(data, 75)
        
    print('Valeur minimale : ' + str(mini))
    print('Valeur maximale : ' + str(maxi))        
    print('Valeur moyenne : ' + str(moy))
    print('Valeur mediane : ' + str(med))
    print('Ecart-type : ' + str(std))
    print('Q1 : ' + str(Q1))
    print('Q3 : ' + str(Q3))
In [27]:
DATA = Data('../data/movie_metadata.csv')
print(DATA.fieldnames)
['movie_title', 'director_name', 'num_critic_for_reviews', 'duration', 'actor_1_name', 'actor_2_name', 'num_voted_users', 'facenumber_in_poster', 'num_user_for_reviews', 'language', 'country', 'content_rating', 'budget', 'title_year', 'imdb_score']

Visualisation des variables quantitatives

Illustration avec un jeu de données synthétiques

  • Tester avec N = 100, 1000, 10000
  • Regarder l'influence du nombre de classes ('bins')

Nuage de points

In [28]:
N = 10000
x = np.random.normal(0,1, N)

plt.figure(figsize = (9,6))
plt.plot(x, 'o')
plt.xlabel('Indices',fontsize=20)
plt.ylabel('Réalisation d''une variable gaussienne',fontsize=20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.show()

statistiques(x)
    
    
Valeur minimale : -3.71329121479
Valeur maximale : 3.84014779715
Valeur moyenne : -0.00743082207247
Valeur mediane : -0.0192350898102
Ecart-type : 0.995121207595
Q1 : -0.69261538332
Q3 : 0.662713231028

Histogramme

In [29]:
y = pd.Series(x, name = "realisations d''une variable gaussienne")
plt.figure(figsize = (9,6))
sns.distplot(x, bins=min(int(np.sqrt(N)), 30), fit = stats.norm, kde= False);
#plt.title('Histogramme',fontsize=20)
plt.xlabel('Réalisations d''une variable gaussienne',fontsize=20)
plt.ylabel('Fréquences normalisées',fontsize=20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.show()

Histogramme et estimation de la densité de probabilité de la variable "budget"

Estimation avec un modèle paramétrique de loi (distribution gamma et distribution gaussienne)

Ajustement du modèle paramétrique au sens des moindres carrés (minimisation de l'écart au carré entre la courbe estimée et l'histogramme (= distribution empirique)).

In [30]:
x = pd.Series(DATA.get_budget(), name = 'budget en $')
sns.distplot(x, bins=40, kde=False, fit = stats.gamma);
plt.title('Histogramme', fontsize = 18)
plt.xticks(fontsize = 18)
plt.yticks(fontsize = 18)
plt.xlabel('budget en $', fontsize = 18)
plt.show()
In [31]:
x = pd.Series(DATA.get_budget(), name = 'budget en $')
sns.distplot(x, bins=40, kde=False, fit = stats.norm);
plt.title('Histogramme', fontsize = 18)
plt.xticks(fontsize = 18)
plt.yticks(fontsize = 18)
plt.xlabel('budget en $', fontsize = 18)
plt.show()

Estimation avec une méthode à noyau gaussien

  • centre = centre de la classe,
  • écart-type = estimation au sens des moindres carrés, si le noyau est gaussien = $\left( \frac{4\sigma^5}{3 N}\right)^{1/5}$;
In [32]:
x = pd.Series(DATA.get_budget(), name = 'budget en $')
sns.distplot(x, bins=40, kde=True);
plt.title('Histogramme', fontsize = 18)
plt.xticks(fontsize = 18)
plt.yticks(fontsize = 18)
plt.xlabel('budget en $', fontsize = 18)
plt.show()

Courbe des fréquences cumulées

In [33]:
x = pd.Series(DATA.get_imdb_score(), name = 'score')
hist, bins_ = np.histogram(x, bins = 30)
hist = hist*1./len(x)
centers = (bins_[1:] + bins_[:-1])/2.

plt.bar(centers, hist, width = 0.7*(centers[1] - centers[0]))
plt.title('histogramme', fontsize = 18)
plt.xticks(fontsize = 18)
plt.yticks(fontsize = 18)
plt.show()


plt.figure()
plt.plot(centers, np.cumsum(hist))
plt.title('frequences cumulées', fontsize = 18)
plt.xticks(fontsize = 18)
plt.yticks(fontsize = 18)
plt.show()

Exercice : tester les autres variables quantitatives

Travaux

Visualisation des variables qualitatives

Diagramme à bâton ... diverses représentations

Diagramme à bâtons avec comptage des individus dans chaque modalité (une variable qualitative)

In [34]:
data = pd.Series(DATA.get_country(), name = "country")
qualitative_barplot(data,"country", figsize = (15,6), fontsize = 18)

Autre représentation via un diagramme en bâton pour analyse tridimensionnelle avec au moins une variable quantitative

In [35]:
# Transformation d'une donnée qualitative (language) en variable binaire "english"/"autre"

ind = (DATA.get_title_year() > 2010)

language = []
language_all = DATA.get_language()
for i in range(len(language_all)):
    if language_all[i] != 'English':
        language_all[i] = 'Other'
    if ind[i]:
        language.append(language_all[i])
        
# Sous ensemble de données : "score", "year", "language"


score = DATA.get_imdb_score()
year = DATA.get_title_year()


df = pd.DataFrame({"score":score[ind], "title_year":year[ind], "language":language})

plt.figure(figsize = (17,9))
sns.barplot(x="title_year", y = "score", hue = "language", data = df, ci = 'sd')
plt.xlabel("title_year",fontsize = 20)
plt.ylabel("score",fontsize = 20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend(fontsize=20)
plt.title('Estimation de la moyenne et écart-type de l''estimateur de la moyenne', fontsize = 20)
plt.show()

Diagramme à bâton cumulés pour analyse bidimensionnelle qualitative-qualitative ou quantitative-qualitative

In [36]:
df = pd.DataFrame({"imdb_score":DATA.get_imdb_score(), "title_year":DATA.get_title_year(), "country":DATA.get_country()})
table = double_entree(df, "title_year", "country", figsize = (17,14), fontsize = 14)
table.plot(kind="bar", figsize=(17,14),stacked=True,  fontsize = 14)
plt.show()

Boîtes à moustaches / Boxplot

Données unidimensionnelles

In [37]:
data = pd.Series(DATA.get_imdb_score(), name = 'score')
plt.figure(figsize =(10, 2))
sns.boxplot(x = data)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.xlabel("score", fontsize = 20)
plt.show()
In [38]:
N = len(data)
print('N = '+str(N))

med = np.median(data)

Q1 = np.percentile(data, 25)
Q2 = np.percentile(data, 50)
Q3 = np.percentile(data, 75)
print('Q1 = ' +str(Q1))
print('Q2 = ' +str(Q2) + ' et médiane : ' + str(med))
print('Q3 = ' +str(Q3))
N = 4125
Q1 = 5.8
Q2 = 6.5 et médiane : 6.5
Q3 = 7.2

Données multidimensionnelles avec au moins une variable qualitative

In [39]:
# Transformation d'une donnée qualitative (language) en variable binaire "english"/"autre"

ind = (DATA.get_title_year() > 2010)

language = []
language_all = DATA.get_language()
for i in range(len(language_all)):
    if language_all[i] != 'English':
        language_all[i] = 'Other'
    if ind[i]:
        language.append(language_all[i])
        
# Sous ensemble de données : "score", "year", "language"


score = DATA.get_imdb_score()
year = DATA.get_title_year()


df = pd.DataFrame({"score":score[ind], "title_year":year[ind], "language":language})

plt.figure(figsize = (17,9))
sns.boxplot(x="title_year", y = "score", hue = "language", data = df)
plt.xlabel("title_year",fontsize = 20)
plt.ylabel("score",fontsize = 20)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend(fontsize=20)
plt.show()

Exercice : tester les autres variables qualitative

Travaux

In [ ]: